package DataStructures;

import java.util.Scanner;

/**
 * @author ：ALi
 * @date ：Created in 2021/9/12 9:45
 * @description：用数组实现队列
 * @modified By：
 * @version: 数组只能用一次$
 */
public class ArrayQueue {
    public static void main(String[] args){
        //初始化队列
        QueueDemo queue = new QueueDemo(3);
        //接收用户输入
        char key = ' ';
        //循环时用的
        boolean loop = true;
        //标准输入
        Scanner scanner = new Scanner(System.in);
        while (loop){
            System.out.println("s(show):显示队列所有数据");
            System.out.println("c(showCurrentData):显示队列现有数据");
            System.out.println("e(exit):退出数列");
            System.out.println("a(add):添加数据对队列");
            System.out.println("g(get):从队列取出数据");
            System.out.println("h(head):查看队列的头数据");
            key = scanner.next().charAt(0);//接收输入的第一个字符
            switch (key){
                case 's':
                    queue.showQueueAllData();
                    break;
                case 'c':
                    queue.showQueue();
                    break;
                case 'e':
                    scanner.close();
                    loop = false;
                    break;
                case 'a':
                    try {
                        System.out.println("请输入要添加的数据：");
                        int data = scanner.nextInt();
                        queue.addQueue(data);
                    }catch (Exception e) {
                        System.out.println(e.getMessage());
                    }
                    break;
                case 'g':
                    try {
                        int res = queue.getQueue();
                        System.out.printf("取出的数据为:%d\n",res);
                    } catch (Exception e){
                        System.out.println(e.getMessage());//抛的异常为getQueue中的RuntimeException
                    }
                    break;
                case 'h':
                    try {
                        int res = queue.showFront();
                        System.out.printf("头数据为：%d\n",res);
                    } catch (Exception e){
                        System.out.println(e.getMessage());
                    }
                    break;
                default:
                    break;
            }
        }
        System.out.println("程序退出!");

    }


}

/**
 * 创建队列类
 */
class QueueDemo{
    private int MaxLength; //最大长度
    private int front;    //队列的头结点
    private int rear;    //队列的尾结点
    private int[] array;// 队列存储数据的数组

    /**
     * 构造方法
     */
    public QueueDemo(int QueueMaxLength){
        MaxLength = QueueMaxLength;
        array= new int[MaxLength];
        /**
         * 看下图片上画的,初始化为0也是可以的
         */
        front = -1; //front指向队列的头的前一个位置
        rear = -1;  // rear 指向队列尾部元素(即包含最后一个数据)

    }

    /**
     * 判断队列是否满了
     * @return true：满了
     */
    public boolean isFull(){
        return rear == MaxLength-1;
    }

    /**
     * 判断队列为空
     * @return true:空
     */
    public boolean isEmpty(){
        return front == rear;//头尾相等为空
    }

    /**
     * 添加数据到队列
     * @param number 新加的数据
     */
    public void addQueue(int number){
        if(isFull()){
            //抛异常处理
            throw new RuntimeException("队列已经满了，不能添加了！");
        }
        rear++;//尾元素后移
        array[rear] = number;
    }

    /**
     * 取队列的数据(出队列)
     * @return 队列首部的元素
     */
    public int getQueue(){
        if(isEmpty()){
            //抛异常处理
            throw new RuntimeException("队列空，无法取数据");
        }
        int res = array[front+1];
        front++;
        return res;

    }

    /**
     * 显示队列的所有数据
     */
    public void showQueueAllData(){
        if(isEmpty()){
            System.out.println("队列为空");
            return;
        }
        System.out.println("队列所有的数据如下：");
        for (int i = 0;i<MaxLength;i++){
            System.out.printf("array[%d] = %d\n",i,array[i]);//格式化打印
        }
    }

    /**
     * 显示队列的现有数据
     */
    public void showQueue(){
        if(isEmpty()){
            System.out.println("队列为空");
            return;
        }
        System.out.println("队列现有的数据如下：");
        for (int i = front+1;i<=rear;i++){
            System.out.printf("array[%d] = %d\n",i,array[i]);
        }
    }

    /**
     * 显示头数据
     */
    public int showFront(){
        if(isEmpty()){
            throw new RuntimeException("数列为空，没有头数据!");
        }
        return array[front+1];
    }

}